## 窗口层选项，用于控制窗口的外观和行为
extends Object
class_name WindowLayerOption

#region const
const WIDTH_AUTO: int = -1

const HEIGHT_AUTO: int = -1

static var AREA_AUTO: Vector2i = Vector2i(WIDTH_AUTO, HEIGHT_AUTO)

const MAX_WIDTH_DEFAULT: int = 360

const MAX_HEIGHT_DEFAULT: int = 360

const TIME_KEEP_OPEN: int = 0
#endregion const

#region enum
## 窗口类型枚举
enum WindowType
{
	## 弹出窗口
	dialog = 0,
	## 消息窗口
	msg = 1,
	## 加载窗口
	loading = 2,
	## 提示窗口
	tips = 3,
	## 进度窗口
	progress = 4,
}

## 窗口偏移
enum WindowOffset
{
	## 自定义位置
	position = 0,
	## 垂直水平居中
	auto = 1,
	## 上边缘
	t,
	## 右边缘
	r,
	## 下边缘
	b,
	## 左边缘
	l,
	## 右上角
	rt,
	## 右下角
	rb,
	## 左上角
	lt,
	## 左下角
	lb,
}

## 窗口的出场动画
enum WindowAnim
{
	## 平滑放大
	Magnify = 0,
	## 从上掉落
	Fall = 1,
	## 从底部网上滑入
	Raise = 2,
	## 从左滑入
	SlideIn = 3,
	## 从左翻滚
	Roll = 4,
	## 渐显
	FadeIn = 5,
	## 抖动
	Shake = 6,
	## 从上边缘往下
	SlideDown = 7,
	## 从右边缘往左
	SlideLeft = 8,
	## 从下边缘往上
	SlideUp = 9,
	## 从左边缘往右
	SlideRight = 10,
}

## 消息框图标
## 参考：Windows提示框中的图标
## https://learn.microsoft.com/zh-cn/dotnet/api/system.windows.forms.messageboxicon?view=netframework-4.0
enum WindowIcon
{
	## 消息框未包含符号。
	none = 0,
	## 消息框包含一个符号，该符号包含一个红色背景圆圈，圆圈中为白色 X 符号。
	error = 16,
	## 消息框包含一个符号，该符号包含一个红色背景圆圈，圆圈中为白色 X 符号。
	hand = 16,
	## 消息框包含一个符号，该符号包含一个红色背景圆圈，圆圈中为白色 X 符号。
	stop = 16,
	## 消息框包含一个符号，该符号包含一个圆圈，圆圈中为问号。 不再建议使用问号消息图标，因为这种图标无法清楚地表示特定类型的消息，并且作为问题的消息表述可应用于任何消息类型。 此外，用户可能会将问号符号与帮助信息符合混淆。 因此，请不要在消息框中使用问号符号。 系统继续支持它包含的内容，只为满足反向兼容性。
	question = 32,
	## 消息框包含一个符号，该符号包含一个黄色背景三角形，三角形中为感叹号。
	exclamation = 48,
	## 消息框包含一个符号，该符号包含一个黄色背景三角形，三角形中为感叹号。
	warning = 48,
	## 消息框包含一个符号，该符号在圆圈中包含小写字母 i。
	asterisk = 64,
	## 消息框包含一个符号，该符号在圆圈中包含小写字母 i。
	information = 64,
}

## tips弹窗的吸附位置
enum TipsAttachPosition
{
	## 上
	top = 1,
	## 右
	right = 2,
	## 下
	bottom = 3,
	## 左
	left = 4
}

## 提示框的类型
enum PromptType
{
	## 文本输入框
	LineEdit = 0,
	## 密令输入框
	Password = 1,
	## 多行文本输入框
	TextEdit = 2,
}
#endregion enum

var type: WindowType = WindowType.dialog

var title: String = "信息"

var content: String = ""

var area: Vector2i = AREA_AUTO

var maxWidth: int = MAX_WIDTH_DEFAULT

var maxHeight: int = MAX_HEIGHT_DEFAULT

var offset: WindowOffset = WindowOffset.auto

var anim: WindowAnim = WindowAnim.Magnify

var isOutAnim: bool = true

var icon: WindowIcon = WindowIcon.none

var time: int = TIME_KEEP_OPEN

var resize: bool = true

var tips: TipsAttachPosition = TipsAttachPosition.right

func _init(_type: WindowType = WindowType.dialog, _title: String = "信息",
	_content: String = "", _area: Vector2i = AREA_AUTO,
	_maxWidth: int = MAX_WIDTH_DEFAULT, _maxHeight: int = MAX_HEIGHT_DEFAULT,
	_offset: WindowOffset = WindowOffset.auto, _anim: WindowAnim = WindowAnim.Magnify,
	_isOutAnim: bool = false, _icon: WindowIcon = WindowIcon.none,
	_time: int = TIME_KEEP_OPEN, _resize: bool = true,
	_tips: TipsAttachPosition = TipsAttachPosition.right) -> void:
	type = _type
	title = _title
	content = _content
	area = _area
	maxWidth = _maxWidth
	maxHeight = _maxHeight
	offset = _offset
	anim = _anim
	isOutAnim = _isOutAnim
	icon = _icon
	time = _time
	resize = _resize
	tips = _tips
	
func _to_string() -> String:
	return ("类型：{1}{0}标题：{2}{0}内容：{3}{0}宽度：{4}{0}高度：{5}{0}" +
		"最大宽度：{6}{0}最大高度：{7}{0}偏移：{8}{0}动画：{9}{0}关闭动画：{10}{0}" +
		"图标：{11}{0}定时关闭：{12}{0}调整尺寸：{13}{0}提示停靠位置：{14}").format([
			"\n", type, title, content, area.x, area.y,
			maxWidth, maxHeight, offset, anim, isOutAnim,
			icon, time, resize, tips ])
